<?php
/**

 //  DoYouHaoBaby-X Ucenter ( DoYouHaoBaby-X 计划 )
 //  +---------------------------------------------------------------------
 //
 //  “Copyright”
 //  +---------------------------------------------------------------------
 //	 | (C) 2010 - 2011 http://doyouhaobaby.net All rights reserved.
 //	 | This is not a free software, use is subject to license terms
 //  +---------------------------------------------------------------------
 //
 //  “About This File”
 //  +---------------------------------------------------------------------
 //	 | Ucenter 公用控制器
 //  +---------------------------------------------------------------------

*/

!defined( 'DYHB_PATH' ) && exit;

class InitController extends Controller{


   /**
    * 系统配置信息
    *
    * @var array
    */
   public $_arrOptions = array();

   /**
    * 构造函数
    */
    public function __construct( ){

   	   parent::__construct();

   	   // 取得系统配置信息
	   $arrOptions = OptionModel::optionData( );
	   if( $arrOptions===false ){

	   	   $this->E( G::L( '获取数据库配置信息错误，也许你的数据库相关信息错误！' ) );
	   }

	   $this->_arrOptions = $arrOptions;
   }

   /**
    * 全局权限处理
    */
   public function init__( ){

   	   // 初始化当前用户登录信息
       UserModel::M()->authData( );
       if( UserModel::M()->isBehaviorError() ){// 捕获错误

           $this->E ( UserModel::M()->getBehaviorErrorMessage() );
       }

	   // 启动Rbac验证
	   UserModel::M()->checkRbac(  );

	   // 开始查找Rbac行为扩展中异常
       if( UserModel::M()->isBehaviorError() ){

           $this->E ( UserModel::M()->getBehaviorErrorMessage() );
       }
   }


   /**
    * 数据列表
    */
   public function index( ) {

		// 生成查询Map对象
		$arrMap = $this->map(  );

        // 判断是否存在过滤方法
		// 这个主要用于模糊查找
		if ( method_exists (  $this, 'filter_' ) ) {

			$this->filter_ ( $arrMap );
		}

		$sModel = ucfirst( MODULE_NAME ).'Model';
		$oSelect = '';
        eval( '$oSelect = '.$sModel.'::F( );' );

        // 取得显示结果列表
        $this->get_list( $oSelect,$arrMap );
		$this->display ();
	}


   /**
    * 数据查询条件
    */
   protected function map( $sName = '' ) {

		// 生成查询条件
		if (  empty (  $sName  ) ) {

			$sName = MODULE_NAME;
		}

        $sName  = ucfirst( $sName ).'Model';

        // 取得模型字段到属性的映射
        $arrField =array();
		eval( '$arrField = '.$sName.'::M( )->_arrFieldToProp;' );

		$arrMap = array ();
		foreach ( $arrField  as $sField => $sProp ) {

			if ( isset ( $_REQUEST [ $sField ] ) &&
				 !empty( $_REQUEST [ $sField ] ) ) {

				$arrMap[ $sField ] = $_REQUEST [ $sField ];
			}

		}

		return $arrMap;

	}


   /**
    * 获取分页列表数据
    */
    protected function get_list(  $oSelect,$arrMap  ){

   	    // 初始化变量
		$sParameter='';
		$sSortUrl='';
		$sName = MODULE_NAME;

		// 获取总记录数
    	$nTotalRecord = $oSelect->where( $arrMap )->all()->getCount( );

    	// 分页记录数量
		$nEverynum = $this->_arrOptions['admineverynum'];

		// 分页跳转的时候保证查询条件/
		foreach ( $arrMap as $sKey => $sVal ) {

			if ( !is_array ( $sVal ) ) {

				$sParameter .= $sKey.'=' . urlencode ( $sVal ) .'&';
				$sSortUrl .= '/'.$sKey.'/' . urlencode ( $sVal );
			}
		}

		// 排序条件
		$sSortBy = strtoupper( Safe::getGpc( 'sort_' ) ) == 'ASC' ? 'ASC' :'DESC' ;
		$sOrder = Safe::getGpc( 'order_' ) ? Safe::getGpc( 'order_' ) : $sName.'_id';

		$this->assign( 'sSortByUrl', $sSortBy == 'DESC'? 'ASC' : 'DESC' );
		$this->assign( 'sSortByDescription',$sSortBy == 'DESC' ? G::L( '倒序') : G::L( '升序' ) );
		$this->assign( 'sOrder',$sOrder );
		$this->assign( 'sSortUrl',__ACTION__.$sSortUrl);

		// 使用分页类
		$oPage = Page::RUN( $nTotalRecord,$nEverynum, Safe::getGpc( G::C('PAGE_VAR_NAME') ) );
		$oPage->setParameter ( $sParameter );
		$sPageNavbar = $oPage->P( );

		// 获取数据列表
		$arrList = $oSelect
			       ->where( $arrMap )
			       ->all()
			       ->order( $sOrder.' '.$sSortBy )
			       ->limit( $oPage->returnPageStart( ), $nEverynum )
			       ->asArray()
			       ->query();

		$this->assign( 'sPageNavbar',$sPageNavbar );
    	$this->assign( 'arrList',$arrList );

   }


   /**
    * Ajax修改列表数据项
    */
   public function input_change_ajax( ){

   	   $sModel = MODULE_NAME;

   	   $oModelMeta = null;
       eval( '$oModelMeta = '.ucwords( $sModel ).'Model::M( );' );

       $sPk = reset( $oModelMeta->_arrIdName );

   	   $nInputAjaxId  = Safe::getGpc( 'input_ajax_id' );
   	   $sInputAjaxField = Safe::getGpc( 'input_ajax_field' );
   	   $sInputAjaxVal = Safe::getGpc( 'input_ajax_val' );

   	   $arrData = array(

   	      $sPk => $nInputAjaxId,
   	      $sInputAjaxField => $sInputAjaxVal,
   	   );

       // badword 特殊处理
   	   if( $sModel =='badword' && $sInputAjaxField=='badword_find' ){

   	       $arrData['badword_findpattern']= '/'.$sInputAjaxVal.'/is';
   	   }

   	   if( $sInputAjaxField=='badword_find' ){

   	       $this->input_change_unique();
   	   }

   	   $oModelMeta->updateDbWhere( $arrData );

   	   // 开始模型Meta中的错误，如果没有那么路过
	   if( $oModelMeta->isError( ) ){

		   $this->E( $oModelMeta->getErrorMessage() );
	   }

	   else{

	   	   $arrVo = array(

   	   	      'id' => $sInputAjaxField.'_'.$nInputAjaxId,
   	   	      'value' => $sInputAjaxVal,
   	   	   );

   	       $this->A( $arrVo, G::L( '数据更新成功！') );
	   }

   }


   /**
    * 唯一性处理( Ajax列表数据 )
    */
   public function input_change_unique( ){

   	    $sModel = ucfirst(  MODULE_NAME );

   	    $oModelMeta = null;
        eval( '$oModelMeta = '.$sModel.'Model::M( );' );

    	$nId = Safe::getGpc( 'input_ajax_id' );
    	$sField = Safe::getGpc( 'input_ajax_field' );
    	$sName = Safe::getGpc( 'input_ajax_val' );
    	$sInfo = '';

    	if( $nId ){

    		$oModel = null;
            eval( '$oModel = '.$sModel.'Model::F( \''.MODULE_NAME.'_id=?\','.$nId.' )->query( );' );
    		$arrInfo = $oModel->toArray();
    		$sInfo = $arrInfo[ $sField ];
    	}

    	if( $sName != $sInfo ){

            $oSelect =null;
            eval( '$oSelect = '.$sModel.'Model::F( );' );
    		$sFunc ='getBy'.$sField;
            $arrResult = $oSelect->{$sFunc}( $sName )->toArray();
    	    if( !empty( $arrResult[ $sField ] ) ) {

    	       $this->E( G::L( '该项数据已经存在！' ) );
            }
    	}

    }


	/**
	 * 生成验证码
	 */
    public function seccode( ){

    	Safe::seccode( );
    }


   /**
    * 向数据库写入数据
    */
   public function insert( ){

       // 创建模型
       $oModel = null;
       eval( '$oModel = new '.ucfirst( MODULE_NAME ).'Model( );' );

       // 保存数据
       $oModel->save( );

       // 开始查找错误
       if(  !$oModel->isError( ) ) {

           if( 'user'!==MODULE_NAME ){

               $this->A( $oModel->toArray( ),G::L( '数据保存成功！' ),1 );
           }

           else{

           	   $arrUser = $oModel->toArray( );
               $nId = reset( $arrUser );
           	   $this->assign('__JumpUrl__', G::U( MODULE_NAME.'/edit?id='.$nId ) );
               $this->S( G::L( '数据保存成功！' ) );
           }

        }

        else{

        	$this->E(  $oModel->getErrorMessage( ) );
        }

   }


   /**
    * 编辑数据库记录
    */
   public function edit( ){

	  $nId = Safe::getGpc( 'id','G' );

      // 判断是否存在编辑项
      if( !empty( $nId ) ) {

          $oModel = null;
          eval( '$oModel = '.ucfirst( MODULE_NAME ).'Model::F( \''.MODULE_NAME.'_id=?\','.$nId.' )->query( );' );

          if( $oModel ) {

              $this->assign( 'arrValue',$oModel->toArray() );
              $this->assign( 'nId',$nId );
              $this->display( MODULE_NAME.'+add' );
          }

          else{

              $this->E( G::L( '数据库中并不存在该项，或许它已经被删除了！' ) );
          }

       }

       else{

           $this->E( G::L( '编辑项不存在！' ) );
       }

   }


   /**
    * 更新数据记录
    */
   public function update( ){

       $nId = Safe::getGpc( 'id' );

       $oModel = null;
       eval( '$oModel = '.ucfirst( MODULE_NAME ).'Model::F( \''.MODULE_NAME.'_id=?\','.$nId.' )->query( );' );

       $oModel->save( 'update' );

       if( $oModel->getErrorMessage( )=='zero-effect' ){

       	   $this->E( G::L( '你没有修改数据！' ) );
       }

       // 开始捕获模型中的错误
       if( !$oModel->isError( )  ) {

            $this->S( G::L( '数据更新成功！' ) );
        }

        else{

        	$this->E( $oModel->getErrorMessage( ) );
        }

   }


   /**
    * 删除数据库记录
    */
   public function foreverdelete(){

   	   $sModel = MODULE_NAME;
	   $sId = Safe::getGpc( 'id' ,'G' );

       if(  !empty( $sId )  ) {

           $oModelMeta = null;
       	   eval( '$oModelMeta = '.ucfirst( $sModel ).'Model::M( );' );

           $sPk = reset( $oModelMeta->_arrIdName );

           // 执行删除
           $oModelMeta->deleteWhere(  array( $sPk=> array( 'in',$sId ) ) );

           // 开始模型Meta中的错误，如果没有那么路过
		   if( $oModelMeta->isError( ) ){

		       $this->E( $oModelMeta->getErrorMessage() );
		   }

		   else{

		   	   $this->A( '',G::L( '删除记录成功！' ),1 );
		   }

        }

        else{

            $this->E( G::L( '删除项不存在！' ) );
        }

   }


   /**
    * 禁用数据库记录
    */
   public function forbid( ){

   	   $sModel = MODULE_NAME;
	   $sId = Safe::getGpc( 'id' ,'G' );

       if(  !empty( $sId )  ) {

           $oModelMeta = null;
       	   eval( '$oModelMeta = '.ucfirst( $sModel ).'Model::M( );' );

       	   $sPk = reset( $oModelMeta->_arrIdName );

           // 执行更新
           $oModelMeta->updateDbWhere( array( $sModel.'_status'=>0 ),array( $sPk=>$sId ) );

           // 开始模型Meta中的错误，如果没有那么路过
		   if( $oModelMeta->isError( ) ){

		       $this->E( $oModelMeta->getErrorMessage() );
		   }

		   else{

               $this->assign('__JumpUrl__',G::U($sModel.'/index'));
		   	   $this->S( G::L( '禁用成功！' ) );
		   }

        }

        else{

            $this->E( G::L( '禁用项不存在！' ) );
        }

   }


   /**
    * 恢复记录
    */
   public function resume( ){

   	   $sModel = MODULE_NAME;
	   $sId = Safe::getGpc( 'id' ,'G' );

       if(  !empty( $sId )  ) {

           $oModelMeta = null;
       	   eval( '$oModelMeta = '.ucfirst( $sModel ).'Model::M( );' );

       	   $sPk = reset( $oModelMeta->_arrIdName );

           // 执行更新
           $oModelMeta->updateDbWhere( array( $sModel.'_status'=>1 ),array( $sPk=>$sId ) );

           // 开始模型Meta中的错误，如果没有那么路过
		   if( $oModelMeta->isError( ) ){

		       $this->E( $oModelMeta->getErrorMessage() );
		   }

		   else{

               $this->assign('__JumpUrl__',G::U($sModel.'/index'));
		   	   $this->S( G::L( '恢复成功！' ) );
		   }

        }

        else{

            $this->E( G::L( '恢复项不存在！' ) );
        }

   }

   /**
    * 保存排序数据
    */
   public function save_sort() {

		$sMoveResult = Safe::getGpc( 'moveResult','P' );

		if ( !empty ( $sMoveResult ) ) {

			$oModel = null;
            eval( '$oModel = new '.ucfirst( MODULE_NAME ).'Model( );' );

			$oDb = $oModel->getDb();

		    // 更新数据对象
			$arrCol = explode ( ',', $sMoveResult );

			// 启动事务
			$oDb->getConnect( )->startTransaction();

			foreach ( $arrCol as $val ) {

				$val = explode ( ':', $val );

				$oModel = null;
                eval( '$oModel = '.ucfirst( MODULE_NAME ).'Model::F( \''.MODULE_NAME.'_id=?\','.$val[0].' )->query( );' );

                $oModel->{MODULE_NAME.'_sort'} = $val[1];

				$bResult = $oModel->save( 'update' );

				if ( !$bResult ) {

					break;
				}

			}

			// 提交事务
			$oDb->getConnect()->commit();

			if ( $bResult !==false ) {

				$this->S( G::L( '更新成功') );
			}

			else {

				// 事务回滚
				$oDb->getConnect()->rollback( );

				$this->E( $oModel->getErrorMessage( ) );
			}
		}

		else{

			$this->E( G::L( '没有可以排序的数据！') );
		}
    }

}
